/**
 * 调试工具
 * 提供统一的日志记录和错误处理功能
 */

// 日志级别
export enum LogLevel {
  DEBUG = 0,
  INFO = 1,
  WARN = 2,
  ERROR = 3
}

// 当前日志级别（开发环境显示所有日志，生产环境只显示警告和错误）
const currentLogLevel = process.env.NODE_ENV === 'development' ? LogLevel.DEBUG : LogLevel.WARN;

/**
 * 格式化时间戳
 */
function formatTimestamp(): string {
  const now = new Date();
  return now.toLocaleTimeString('zh-CN', {
    hour12: false,
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    timeZoneName: 'short'
  });
}

/**
 * 序列化错误对象
 * @param error 错误对象
 * @returns 序列化后的错误信息
 */
export function serializeError(error: any): string {
  if (!error) return 'Unknown error';
  
  try {
    // 如果是Error对象，提取关键信息
    if (error instanceof Error) {
      const errorInfo: any = {
        name: error.name,
        message: error.message,
        stack: error.stack
      };
      
      // 检查是否有cause属性（ES2022+）
      if ('cause' in error) {
        errorInfo.cause = (error as any).cause;
      }
      
      return JSON.stringify(errorInfo, null, 2);
    }
    
    // 尝试直接序列化
    return JSON.stringify(error, null, 2);
  } catch (e) {
    // 序列化失败，返回字符串表示
    return error.toString();
  }
}

/**
 * 调试日志
 * @param message 消息
 * @param data 附加数据
 */
export function debug(message: string, data?: any): void {
  if (currentLogLevel <= LogLevel.DEBUG) {
    const timestamp = formatTimestamp();
    console.log(`🐛 [${timestamp}] DEBUG: ${message}`);
    if (data !== undefined) {
      console.log('📊 Data:', data);
    }
  }
}

/**
 * 信息日志
 * @param message 消息
 * @param data 附加数据
 */
export function info(message: string, data?: any): void {
  if (currentLogLevel <= LogLevel.INFO) {
    const timestamp = formatTimestamp();
    console.log(`ℹ️ [${timestamp}] INFO: ${message}`);
    if (data !== undefined) {
      console.log('📊 Data:', data);
    }
  }
}

/**
 * 警告日志
 * @param message 消息
 * @param data 附加数据
 */
export function warn(message: string, data?: any): void {
  if (currentLogLevel <= LogLevel.WARN) {
    const timestamp = formatTimestamp();
    console.warn(`⚠️ [${timestamp}] WARN: ${message}`);
    if (data !== undefined) {
      console.warn('📊 Data:', data);
    }
  }
}

/**
 * 错误日志
 * @param message 消息
 * @param error 错误对象
 * @param context 上下文信息
 */
export function error(message: string, error?: any, context?: any): void {
  if (currentLogLevel <= LogLevel.ERROR) {
    const timestamp = formatTimestamp();
    console.error(`❌ [${timestamp}] ERROR: ${message}`);
    
    if (error) {
      const serializedError = serializeError(error);
      console.error('🔥 Error Details:', serializedError);
    }
    
    if (context) {
      console.error('🔍 Context:', context);
    }
  }
}

/**
 * 性能监控
 * @param label 标签
 * @param fn 要监控的函数
 * @returns 函数执行结果
 */
export async function performance<T>(label: string, fn: () => Promise<T>): Promise<T> {
  const startTime = Date.now();
  debug(`⏱️ 开始执行: ${label}`);
  
  try {
    const result = await fn();
    const endTime = Date.now();
    const duration = endTime - startTime;
    
    info(`✅ 执行完成: ${label} (耗时: ${duration}ms)`);
    return result;
  } catch (err) {
    const endTime = Date.now();
    const duration = endTime - startTime;
    
    error(`❌ 执行失败: ${label} (耗时: ${duration}ms)`, err);
    throw err;
  }
}

/**
 * 网络请求日志
 * @param method HTTP方法
 * @param url 请求URL
 * @param data 请求数据
 * @param response 响应数据
 * @param duration 请求耗时
 */
export function logRequest(
  method: string,
  url: string,
  data?: any,
  response?: any,
  duration?: number
): void {
  const timestamp = formatTimestamp();
  const durationText = duration ? ` (${duration}ms)` : '';
  
  info(`🌐 [${timestamp}] ${method.toUpperCase()} ${url}${durationText}`);
  
  if (data && currentLogLevel <= LogLevel.DEBUG) {
    debug('📤 Request Data:', data);
  }
  
  if (response && currentLogLevel <= LogLevel.DEBUG) {
    debug('📥 Response Data:', response);
  }
}

/**
 * 用户操作日志
 * @param action 操作名称
 * @param details 操作详情
 */
export function logUserAction(action: string, details?: any): void {
  info(`👤 用户操作: ${action}`, details);
}

/**
 * 页面访问日志
 * @param pageName 页面名称
 * @param params 页面参数
 */
export function logPageVisit(pageName: string, params?: any): void {
  info(`📄 页面访问: ${pageName}`, params);
}

// 导出默认对象
export default {
  debug,
  info,
  warn,
  error,
  performance,
  logRequest,
  logUserAction,
  logPageVisit,
  serializeError
};